﻿// ## 2021/02/17 # 江东新风 # 无所属武将光环气力异常修复 ##
// ## 2021/01/31 # 江东新风 # rand函数错误修复 ##
// ## 2020/12/12 #江东新风# 修复trace参数类型错误 ##
// ## 2020/11/23 #江东新风# 配合光环可视化修改常量取得方式 ##
// ## 2020/11/02 #江东新风# 修复气力光环台词bug ##
// ## 2020/10/26 #氕氘氚# 修复武干没有最小光环效果的bug, 改了下军魂倍率 ##
// ## 2020/09/23 #江东新风# 修复气力光环台词重复显示bug ##
// ## 2020/09/21 #江东新风# 修复刚达到基础值时不获得最小光环效果的bug ##
// ## 2020/08/16 #江东新风# 刪除部分常量 ##
// ## 2020/08/14 #江东新风#将光环系统的具体执行部分全放入系统内置函数裡，仅保留光环相关的计算部分在此##
// ## 2020/08/10 #江东新风#配合k神内存修改器，现在可以拥有250新特技了##
// ## 2020/08/04 #江东新风#新增特技战神，整合636兵圣特技，兵圣，战神，武干，军魂支持?定宝物##
// ## 2020/08/01 #江东新风#修复了出征界面部队能力不同步的問題##
// @@ 2020/07/15 @ryan_knight_12@江东新风?譯自RK的sire光环系统@@
namespace halo
{
	///////////////////////////////////////////////////////////////////////////////
	/////////////////////////////				///////////////////////////////////
	/////////////////////////////	CUSTOMIZE	///////////////////////////////////
	/////////////////////////////				///////////////////////////////////
	///////////////////////////////////////////////////////////////////////////////
	///基础光环0，战法暴击率1，暴击伤害2，计策成功3，计策识破4，辅助攻击5，气力回复6
	const int 光环基础范围 = 1; //

	const bool debug_mode = false;//开?debug模式

	int func_光环范围(pk::unit@unit, int 光环类型)//获取部队光环范围
	{
		return pk::get_halo_range(unit, 光环类型);//直接调用内部函数，以实现函数效果统一
		/*
		int 光环基础范围 = int(pk::core["光环.基础光环基本范围"]);
		int 基础光环相关属性 = int(pk::core["光环.基础光环关联属性"]);
		int 战法暴击率光环相关属性 = int(pk::core["光环.暴击率光环关联属性"]);
		int 暴击伤害光环相关属性 = int(pk::core["光环.暴击伤害光环关联属性"]);
		int 计策成功率光环相关属性 = int(pk::core["光环.计略成功率关联属性"]);
		int 计策识破率光环相关属性 = int(pk::core["光环.计略识破率关联属性"]);
		int 辅助攻击光环相关属性 = int(pk::core["光环.辅助攻击关联属性"]);
		int 气力回复光环相关属性 = int(pk::core["光环.气力回复关联属性"]);
		int 一级基础光环需求 = int(pk::core["光环.基础光环阈值"]);
		int 二级基础光环需求 = int(pk::core["光环.基础光环阈值2"]);
		int 三级基础光环需求 = int(pk::core["光环.基础光环阈值3"]);
		int 战法暴击率光环属性需求 = int(pk::core["光环.暴击率光环阈值"]);
		int 暴击伤害光环属性需求 = int(pk::core["光环.暴击伤害光环阈值"]);
		int 计策成功率光环属性需求 = int(pk::core["光环.计略成功率阈值"]);
		int 计策识破率光环属性需求 = int(pk::core["光环.计略识破率阈值"]);
		int 辅助攻击光环属性需求 = int(pk::core["光环.辅助攻击阈值"]);
		int 气力回复光环属性需求 = int(pk::core["光环.气力回复阈值"]);

		int n = -1;
		if (unit !is null)
		{
			pk::person@dst_leader = pk::get_person(unit.leader);
			if (dst_leader is null)
				return -1;
			if (int(dst_leader.stat[基础光环相关属性]) < 一级基础光环需求)
				n = -1;
			if (int(dst_leader.stat[基础光环相关属性]) >= 一级基础光环需求)
				n = 光环基础范围;
			if (int(dst_leader.stat[基础光环相关属性]) >= 二级基础光环需求)
				n += 1;
			if (int(dst_leader.stat[基础光环相关属性]) >= 三级基础光环需求)
				n += 1;

			if ((ch::has_skill(dst_leader, 特技_武干)) and (int(dst_leader.stat[基础光环相关属性]) >= 一级基础光环需求))
			{
				n += 1;
			}
			else if ((ch::has_skill(dst_leader, 特技_武干)) and (int(dst_leader.stat[基础光环相关属性]) < 一级基础光环需求))
			{
				n = 光环基础范围;
			}

			if (光环类型 == 0)
				return n;
			else if ((光环类型 == 1) and int(dst_leader.stat[战法暴击率光环相关属性]) >= 战法暴击率光环属性需求)
				return n;
			else if ((光环类型 == 2) and int(dst_leader.stat[暴击伤害光环相关属性]) >= 暴击伤害光环属性需求)
				return n;
			else if ((光环类型 == 3) and int(dst_leader.stat[计策成功率光环相关属性]) >= 计策成功率光环属性需求)
				return n;
			else if ((光环类型 == 4) and int(dst_leader.stat[计策识破率光环相关属性]) >= 计策识破率光环属性需求)
				return n;
			else if ((光环类型 == 5) and int(dst_leader.stat[辅助攻击光环相关属性]) >= 辅助攻击光环属性需求)
				return n;
			else if ((光环类型 == 6) and int(dst_leader.stat[气力回复光环相关属性]) >= 气力回复光环属性需求)
				return n;
			else return -1;
		}
		return n;
*/

	}

	int func_光环效果(pk::unit@unit, int 光环类型)//获取部队光环效果,需要目标武将
	{
		int n = 0;
		int ntemp = -1;
		float m = 1.f;
		pk::person@dst_leader = pk::get_person(unit.leader);

		bool has_skill = false;
		if (光环类型 == 0 and ch::has_skill(unit, 特技_武干)) has_skill = true;
		if (dst_leader.stat[pk::get_halo_stat_type(光环类型)] >= uint8(pk::get_halo_threshold(光环类型)) or has_skill)
		{
			ntemp = int((dst_leader.stat[pk::get_halo_stat_type(光环类型)] - uint8(pk::get_halo_threshold(光环类型))) * pk::get_halo_co_eff(光环类型) / 100 + pk::get_halo_eff_min(光环类型));
			
			//先计算基础数值，再叠加buff
			int buff = 100;
			bool has_军魂 = ch::has_skill(unit, 特技_军魂);
			if (has_军魂)
				buff = pk::core::skill_constant_value(特技_军魂);
			//逆势不与军魂叠加
			if (!has_军魂 and ch::has_skill(unit, 特技_逆势) and !pk::is_in_water(unit))
				buff = 100 + pk::core::skill_constant_value(特技_逆势);

			if (city_tech::is_unit_force_has_city(unit, 13))
				buff = int(buff * 1.3);
			ntemp = ntemp * buff / 100;//减少浮点数运算
			n = pk::min(pk::max(ntemp, pk::get_halo_eff_min(光环类型)), pk::get_halo_eff_max(光环类型));
		}

		return n;
	}

	bool isbetter(pk::unit@src, pk::unit@dst, int 光环类型)//比較两部队主将官职和光环效果，前者大返回true，否则返回false
	{
		pk::person@src_leader = pk::get_person(src.leader);
		pk::person@dst_leader = pk::get_person(dst.leader);
		if (src.leader == dst.leader) return true;
		// 调试发现君主官职为80，则优先处理
		if (pk::is_kunshu(src_leader)) return true;
		if (pk::is_kunshu(dst_leader)) return false;
		if (src_leader.rank < dst_leader.rank) //光环取官官职数值小者（君主为0，官职越大值越小）
			return true;
		else if (src_leader.rank > dst_leader.rank)
			return false;
		else
		{
			if (func_光环效果(src, 光环类型) >= func_光环效果(dst, 光环类型))
				return true;
			else return false;
		}
	}

	int func_get_highest_halo(pk::unit@src, int 光环类型)//获取附近有光环的友方部队中官职光环效果最高的部队id
	{
		int n = -1;

		if (src is null) return -1;
		int src_force_id = src.get_force_id();
		if (!pk::is_valid_force_id(src_force_id)) return -1;
		pk::force@ force = pk::get_force(src_force_id);
		if (!pk::is_alive(force)) return -1;

		if (func_光环范围(src, 光环类型) != -1)
			n = src.get_id();

		for (int i = 0; i < 部队_末; ++i)
		{
			auto unit = pk::get_unit(i);
			if (!pk::is_alive(unit)) continue;
			if (unit.get_force_id() != src_force_id) continue;
			if (unit.status != 部队状态_通常) continue;
			int range = func_光环范围(unit, 光环类型);
			if (range < 1) continue;

			int distance = pk::get_distance(src.pos, unit.pos);
			if (distance > range) continue;

			if (n == -1)
				n = i;
			else
			{
				pk::unit@prev_halo = pk::get_unit(n);
				if (isbetter(prev_halo, unit, 光环类型))
					continue;
				else
					n = i;
			}
		}

		return n;
	}


	class Main
	{
		Main()
		{
			pk::bind(112, pk::trigger112_t(onTurnEnd));//气力回复
		}

		///气力回复光环		
		void onTurnEnd(pk::force@ force)
		{
			if ((!基础光环) or (!气力回复光环))
				return;
			if (!pk::is_alive(force)) return;
			int src_force_id = force.get_id();
			for (int i = 0; i < 部队_末; ++i)
			{
				auto unit = pk::get_unit(i);
				if (!pk::is_alive(unit)) continue;
				if (unit.get_force_id() != src_force_id) continue;
				int dst_id = func_get_highest_halo(unit, 6);
				if (!pk::is_valid_unit_id(dst_id)) continue;

				auto dst = pk::get_unit(dst_id);
				pk::person@ dst_leader = pk::get_person(dst.leader);
				//pk::unit@ dst = pk::get_unit(dst_id);
				int energy = func_光环效果(dst, 6);
				//不需要考虑上限，加的时候还会算
				pk::add_energy(unit, energy, true);
				if (pk::rand_bool(30))
				{
					if (pk::is_in_screen(unit.pos))
					{
						pk::person@ 兵士 = pk::get_person(武将_兵士);
						switch (pk::rand(3))
						{
						case 0: pk::say(pk::encode(pk::format("能跟随着\x1b[1x{}\x1b[0x大人真是太棒了.", pk::decode(pk::get_name(dst_leader)))), 兵士); break;
						case 1: pk::say(pk::encode(pk::format("有\x1b[1x{}\x1b[0x大人在，我们无所畏惧.", pk::decode(pk::get_name(dst_leader)))), 兵士); break;
						case 2: pk::say(pk::encode(pk::format("\x1b[1x{}\x1b[0x阁下真是我辈的榜样呀.", pk::decode(pk::get_name(dst_leader)))), 兵士); break;
						}
					}
				}
			}
		
		}
	}

	Main main;
} // end - namespace